//导入axios库
import axios from "axios";
//导入config.ts文件
import config from "@/config";
//导入消息框
import { ElMessage } from "element-plus";
//导入token状态
import { useToken } from "@/stores/token";
//导入路由函数
import router from "@/router";

//执行方法得tokenStore对象
const tokenStore = useToken();

//获得config.ts文件导出的baseURL值
const baseURL = config.baseURL;

//创建axios对象
//注：通过相对路径设置axios请求地址时，baseURL将作为请求地址的前缀
const service = axios.create({ baseURL });

//request对象拦截器：用于处理axios请求对象
service.interceptors.request.use(
  //请求成功
  (config) => {
    const token = tokenStore.token;
    if (token) {
      config.headers.jwt = token;
    }
    return config;
  },
  //请求失败
  (error) => {
    //将错误向上抛，不做任何处理
    return Promise.reject(error);
  }
);

//response对象拦截器：用于处理axios响应对象
service.interceptors.response.use(
  //响应成功
  (response) => {
    //用户未登录或登录已过期
    if (response.data.errno == 2) {
      //提示错误信息
      ElMessage.error(response.data.errmsg);
      //跳转到登录页面
      router.push("/login");
    }
    //返回响应对象
    return response;
  },
  //响应失败
  (_error) => {
    //通过消息框提示错误信息
    ElMessage({ type: "error", message: "网络请求失败..." });
    /**
     * 通过ElMessage消息框已经处理了错误，所以就返回一个正确的结果，只是一个空对象，
     * 这个空对象返回给了xxx.vue中axios调用时的接收结果
     */
    return Promise.resolve({});
  }
);

//导出创建的axios对象
export default service;
